﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using CapaLogica.CL.Usuario;
using CapaLogica.CL.UtilidadesGenerales;
using CapaLogica.CL.Foro;


namespace CapaLogica.CL.Tema
{
    public class GestorTema
    {


         //<summary>
         //Método registrar un tema
         //</summary>
         //<param name="ptema"></param>
         //<param name="pdescripcion"></param>
         //<param name="pestado"></param>
         //<param name="pfechaInicio"></param>
         //<param name="pfechaFinal"></param>
         //<param name="pcantAportes"></param>
         //<param name="pcalificacion"></param>
         //<param name="plistaIdEstudiantes"></param>
         //<param name="idForo"></param>
         //<param name="idUsuario"></param>
         //<returns></returns>
        public static void registrarTema(string pNombre, string pDescripcion, DateTime pfechaFinal,
                                            Boolean pcalificacion, List<int> plistaIdEstudiantes, int idForo, Boolean pConFecha,
                                            String pJustificacion, int pCantMaxAportes )
        {

            int idUsuario = Session.Id;
            try
            {
                ForoPersistente persisForo = new ForoPersistente();            
                Cl_Foro foro = persisForo.buscarForoPorId(idForo);
                foro.registrarTema(pNombre, pDescripcion,  pfechaFinal, pcalificacion,
                                    plistaIdEstudiantes,  pConFecha, pJustificacion, pCantMaxAportes, idUsuario);


             
            }
            catch(Exception ex){
                throw ex;
            }
        }

     

        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTema(int idForo)
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try{
                 _temas = _persistenteTema.buscarTemaPorForo(idForo);

            }catch (Exception){
                
            }
            return _temas;
         }

        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTodosTema()
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try
            {
                _temas = _persistenteTema.buscarTodosTema();

            }
            catch (Exception)
            {

            }
            return _temas;
        }

        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTemaPorNombre(String pcriterio)
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try
            {
                _temas = _persistenteTema.buscarTemaPorNombre(pcriterio);

            }
            catch (Exception)
            {

            }
            return _temas;
        }

        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTemaPorCantAporte(int pcriterio)
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try
            {
                _temas = _persistenteTema.buscarTemaPorCantAporte(pcriterio);

            }
            catch (Exception)
            {

            }
            return _temas;
        } 
     
        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTemaCalificacion()
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try
            {
                _temas = _persistenteTema.buscarTemaCalificacion();

            }
            catch (Exception)
            {

            }
            return _temas;
        }

        /// <summary>
        /// Método para buscar un tema
        /// </summary>
        /// <param name="pidForo"></param>
        /// <param name="ptema"></param>
        /// <param name="pestado"></param>
        /// <param name="pcalificacion"></param>
        /// <param name="pcantAportes"></param>
        /// <param name="pidUsuario"></param>
        /// <returns></returns>

        public static List<Cl_Tema> buscarTemaSinCalificacion()
        {
            TemaPersistente _persistenteTema = new TemaPersistente();
            List<Cl_Tema> _temas = new List<Cl_Tema>();

            try
            {
                _temas = _persistenteTema.buscarTemaSinCalificacion();

            }
            catch (Exception)
            {

            }
            return _temas;
        } 



        /// <summary>
        /// Metodo que devuelve lista todos los temas de un foro.
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public static List<EsTema> listarTemasDeUnForoGrid(int pIdForo)
        {
            try
            {
                TemaPersistente persistente = new TemaPersistente();

                return persistente.buscarTemasDeUnForo(pIdForo);
            }
            catch (Exception)
            {
                
                throw;
            }

        }


        /// <summary>
        /// Metodo que devuelve lista todos los temas de un foro.
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public static List<Dictionary<String, String>> listarTemasDeUnForoWeb(int pIdForo)
        {
            try
            {
                TemaPersistente persistente = new TemaPersistente();
                List<Dictionary<String, String>> datosTemas = new List<Dictionary<string, string>>();
                Dictionary<String, String> datos = null;
                List<EsTema> temas = persistente.buscarTemasDeUnForo(pIdForo);

                foreach (EsTema temp in temas)
                {
                    datos = new Dictionary<string, string>();
                    datos.Add("id", temp.IdTema);
                    datos.Add("nombre", temp.Nombre);
                    datos.Add("descripcion", temp.Descripcion);
                    datos.Add("abierto", temp.Abierto+"");
                    datos.Add("fechaInicio", temp.FechaInicio);
                    datos.Add("fechaFin", temp.FechaFinal);
                    datos.Add("calificacion", temp.Calificacion+"");
                    datos.Add("justificacion", temp.Justificacion);
                    datos.Add("cantMaxAportes", temp.CantMaxAportes);
                    datos.Add("cantAportes", temp.CantAportes);

                    datosTemas.Add(datos);
                }

                return datosTemas;
                
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        /// <summary>
        /// Método de la clase que buscar todas las carreras del sistema asociadas a un curso.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> buscarEstudiantesAsociadosTema(int pid)
        {

            try
            {
                TemaPersistente persitente = new TemaPersistente();
                List<EsTema> listTemp = persitente.buscarEstudiantesAsociadosTema(pid);
                List<Informacion> datosCursos = new List<Informacion>();

                foreach (EsTema temp in listTemp)
                {
                    datosCursos.Add(temp);
                }

                return datosCursos;
            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Método de la clase que buscar todas las carreras del sistema asociadas a un curso.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> cargarEstudiantesSinAsociar(int pidTema)
        {

            try
            {
                TemaPersistente persitente = new TemaPersistente();
                List<EsTema> listTemp = persitente.listarEstudiantesSinAsociar(pidTema);
                List<Informacion> datosEstudiantes = new List<Informacion>();

                foreach (EsTema temp in listTemp)
                {
                    datosEstudiantes.Add(temp);
                }

                return datosEstudiantes;
            }
            catch (Exception)
            {

                throw;
            }

        }



        public static void CerrarTema(int pIdTema)
        {
            try
            {
                int idUsuario = Session.Id;
                TemaPersistente persisTema = new TemaPersistente();
                persisTema.cerrarTema(pIdTema, idUsuario);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        public static void BorrarTema(int pIdTema)
        {
            try
            {
                int idUsuario = Session.Id;
                TemaPersistente persisTema = new TemaPersistente();
                persisTema.eliminarTema(pIdTema, idUsuario);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Método de la clase encargada de modificar un nuevo tema a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo del Curso, tipo String</param>
        /// <param name="pnombre">Nombre del Curso, tipo String</param>
        /// <param name="pdescripcion">Descripcion de curso, tipo String</param>
        /// <param name="pestado">Estado del curso, tipo Boolean</param>
        /// <remarks></remarks>
        public static void modificarTema( int pid, String pnombre, String pdescripcion, int pidForo, DateTime pfechaInicio, DateTime  pfechaFin, 
                                            Boolean psiCalificacion, String pjustificacion, int pcantMaxAportes, List<int> listaEstudiantesA, int pusuario)
        {
            try
            {
                TemaPersistente _temaPersist = new TemaPersistente();
                Cl_Tema objTema = new Cl_Tema(pid, pnombre, pdescripcion, pidForo, pfechaInicio, pfechaFin, psiCalificacion, pjustificacion, pcantMaxAportes);
                List<int> idsBD = _temaPersist.buscarIdsEstudiantesTema(pid);
                _temaPersist.actualizarTema(objTema, listaEstudiantesA, idsBD, pid, pusuario);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// Método de la clase encargada de modificar un nuevo tema a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo del Curso, tipo String</param>
        /// <param name="pnombre">Nombre del Curso, tipo String</param>
        /// <param name="pdescripcion">Descripcion de curso, tipo String</param>
        /// <param name="pestado">Estado del curso, tipo Boolean</param>
        /// <remarks></remarks>
        public static void modificarTema(int pid, String pnombre, String pdescripcion, DateTime pfechaFin,
                                            Boolean psiCalificacion, String pjustificacion, int pcantMaxAportes, List<int> listaEstudiantesA, Boolean pConFecha)
        {
            try
            {
                TemaPersistente _temaPersist = new TemaPersistente();

                if (pConFecha == false )
                {
                    pfechaFin = DateTime.MinValue;
                }

                _temaPersist.modificarTema(pid, pnombre, pdescripcion, pfechaFin, psiCalificacion, pjustificacion, pcantMaxAportes,listaEstudiantesA, Session.Id, pConFecha );
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }




        public static int cantidadAportesDeEstudiante(int pIdEstudiante, int pTema)
        {
            try
            {
                TemaPersistente persistente = new TemaPersistente();
                int cantidad = 0;
                cantidad = persistente.cantidadDeAportesDeUnEstudianteEnTema(pIdEstudiante, pTema);
                return cantidad;
            }
            catch (Exception ex )
            {
                
                throw ex;
            }

        }

        /// <summary>
        /// Método de la clase encargada de eliminar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static void eliminarTema(int pidTema)
        {
            try
            {
                TemaPersistente _temaPersist = new TemaPersistente();

                _temaPersist.eliminarTema2(pidTema, Session.Id );
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public static Dictionary<String, object> consultarTema(int pIdTema)
        {
            try
            {
                TemaPersistente persistente = new TemaPersistente();
                Cl_Tema tema = persistente.buscarTema(pIdTema);
                Dictionary<String, object> datosTema = new Dictionary<string, object>();

                datosTema.Add("id", tema.IdTema);
                datosTema.Add("nombre", tema.Nombre);
                datosTema.Add("descripcion", tema.Descripcion);
                datosTema.Add("abierto", tema.Abierto);
                datosTema.Add("fechaInicio", tema.FechaInicio);
                datosTema.Add("fechaFin", tema.FechaFinal);
                datosTema.Add("calificacion", tema.Calificacion);
                datosTema.Add("justificacion", tema.Justificacion);
                datosTema.Add("cantMacAporte", tema.CantMaxAportes);
                datosTema.Add("cantAportes", tema.CantAportes);
                datosTema.Add("idDuenioForo", tema.IdDuenioForo);

                if (tema.IdDuenioForo == Session.Id)
                {
                    datosTema.Add("esDuenio", true);
                }
                else
                {
                    datosTema.Add("esDuenio", false);
                }
                

                return datosTema;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
           
        }




        /// <summary>
        /// Metodo que devuelve lista todos los temas de un foro.
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public static List<Dictionary<String, String>> listarTemasDeForoDeEstudiante(int pIdForo)
        {
            try
            {
                TemaPersistente persistente = new TemaPersistente();
                List<Dictionary<String, String>> datosTemas = new List<Dictionary<string, string>>();
                Dictionary<String, String> datos = null;
                List<EsTema> temas = persistente.buscarTemasDeForosDeEstudiante(pIdForo, Session.Id);

                foreach (EsTema temp in temas)
                {
                    datos = new Dictionary<string, string>();
                    datos.Add("id", temp.IdTema);
                    datos.Add("nombre", temp.Nombre);
                    datos.Add("descripcion", temp.Descripcion);
                    datos.Add("abierto", temp.Abierto + "");
                    datos.Add("fechaInicio", temp.FechaInicio);
                    datos.Add("fechaFin", temp.FechaFinal);
                    datos.Add("calificacion", temp.Calificacion + "");
                    datos.Add("justificacion", temp.Justificacion);
                    datos.Add("cantMaxAportes", temp.CantMaxAportes);
                    datos.Add("cantAportes", temp.CantAportes);

                    datosTemas.Add(datos);
                }

                return datosTemas;

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        
    }
}
